package com.alibaba.citrus.cr.price.ability.functions.entity.activity;

import com.epoch.app.crpricecenter.dto.request.ParticipateActivityInfoRequest;
import com.epoch.app.crpricecenter.dto.response.ParticipateActivityInfoResponse;
import lombok.Data;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.StringUtils;

import java.util.Map;
import java.util.Objects;

/**
 * @author hanguo
 * @date 2021/12/2
 * @Description 用于参加活动时聚合数据
 */
@Data
public class ActivityTO {

    /**
     * 活动号
     */
    private String activityId;

    /**
     * 活动项目号
     */
    private String activityTermId;

    /**
     * 促销活动分组管控标识
     */
    private Boolean groupControlFlag;

    /**
     * 请求参数和活动实体对应关系
     */
    private Map<ParticipateActivityInfoRequest,ActivityEntity> activityInfoRequestActivityEntityMap;

    /**
     * 请求参数和预占结果的对应关系
     */
    private Map<ParticipateActivityInfoRequest, ParticipateActivityInfoResponse> activityInfoResponseMap;

    /**
     * 请求参数和更新结果的对应关系
     */

    /**
     * 该活动项目总占用数量
     */
    private Integer quantitySum;

    /**
     * 活动占用费用
     */
    private Long feeSum;

    /**
     * 活动占用结果
     */
    private Boolean result;

    /**
     * 活动便签号
     */
    private String activityNoteId;

    /**
     * 来源系统
     */
    private String source;

    /**
     * 是否可以占用数量和占用金额成功
     */
    public Boolean isCanOccupy() {
        ActivityEntity activityEntity = this.getActivityInfoRequestActivityEntityMap().values().stream().findFirst().orElse(null);
        if (Objects.isNull(activityEntity)) {
            return false;
        }

        if (!groupControlFlag) {
            // 非促销活动分组管控
            // 校验活动剩余量和活动剩余费用
            return this.isCanOccupyTerm(activityEntity);
        } else {
            // 促销活动分组管控
            // 校验便签活动剩余量和便签活动剩余费用
            Boolean canOccupyExt = this.isCanOccupyExt(activityEntity);
            if (!canOccupyExt) {
                return false;
            }

            // 订单中心一盘货订单需要验证活动剩余量和活动剩余金额
            if (StringUtils.equals("OrderCenter", source)) {
                return this.isCanOccupyTerm(activityEntity);
            }

            return true;
        }
    }

    /**
     * 校验活动剩余量和活动剩余费用
     */
    private Boolean isCanOccupyTerm(ActivityEntity activityEntity) {
        ActivityTermEntity termEntity = null;
        if (CollectionUtils.isNotEmpty(activityEntity.getTermEntityList())) {
            termEntity = activityEntity.getTermEntityList().stream()
                    .filter(e -> this.getActivityTermId().equals(e.obtainActivityTermId()))
                    .findFirst()
                    .orElse(null);
        }
        if (Objects.isNull(termEntity)) {
            return false;
        }
        return termEntity.isCanOccupyTerm(this.getQuantitySum(), this.getFeeSum());
    }

    /**
     * 校验便签活动剩余量和便签活动剩余费用
     */
    private Boolean isCanOccupyExt(ActivityEntity activityEntity) {
        ActivityTitleExtEntity activityTitleExtEntity = activityEntity.getTitleExtEntity();
        if (Objects.isNull(activityTitleExtEntity)) {
            return false;
        }
        return activityTitleExtEntity.isCanOccupyTerm(this.getQuantitySum(), this.getFeeSum());
    }
}
